package StructuralPattern.Composite.TransparentMode;

/**
 * @Classname : CompositeClient
 * @Description : 测试 透明组合模式
 * 行为型-组合模式
 * 一、模式定义
 *   Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.
 *   将对象组合成树形结构以表示“部分-整体”的层次结构，使得用户对单个对象和组合对象的使用具有一致性。
 * 二、模式类图
 *   https://kdocs.cn/l/cmJ15ifq9PBb
 * 三、适用场景
 *   1、当需要实现树状结构时，可考虑使用组合模式。
 *   2、由于安全组合模式违反依赖倒置原则，建议优先使用透明组合模式。
 * 四、应用举例
 *   1、树形菜单
 *   2、文件系统
 *
 * @Author : chentianyu
 * @Date 2023/2/19 15:12
 */


public class CompositeClient {
    public static void main(String[] args) {
        // 建立树状结构（项目中一般从数据库中循环查询建立）
        Component president = new Composite("总经理");
        Component aDept = new Composite("A部门经理");
        Component bDept = new Composite("B部门经理");
        Component aStaff = new Leaf("a员工");
        Component bStaff = new Leaf("b员工");
        Component cStaff = new Leaf("c员工");
        Component dStaff = new Leaf("d员工");
        Component eStaff = new Leaf("e员工");
        president.addChild(aDept);
        president.addChild(bDept);
        aDept.addChild(aStaff);
        aDept.addChild(bStaff);
        aDept.addChild(cStaff);
        bDept.addChild(dStaff);
        bDept.addChild(eStaff);
        // 查询节点信息
        president.getInfo();
        aDept.getInfo();
        bDept.getInfo();
        aStaff.getInfo();
        eStaff.getInfo();
        // 叶子节点不支持增加子节点，但是有增加子节点方法，属于透明组合模式
        aStaff.addChild(bStaff);
    }
}

/** 20230219
 * —————————打印节点信息————————
 * 1、本节点: 总经理
 * 2、父节点：无父节点，为根节点
 * 3、子节点：
 *    A部门经理
 *    B部门经理
 *
 * —————————打印节点信息————————
 * 1、本节点: A部门经理
 * 2、父节点：总经理
 * 3、子节点：
 *    a员工
 *    b员工
 *    c员工
 *
 * —————————打印节点信息————————
 * 1、本节点: B部门经理
 * 2、父节点：总经理
 * 3、子节点：
 *    d员工
 *    e员工
 *
 * —————————打印节点信息————————
 * 1、本节点: a员工
 * 2、父节点：A部门经理
 * 3、子节点：无子节点，为叶子节点
 *
 * —————————打印节点信息————————
 * 1、本节点: e员工
 * 2、父节点：B部门经理
 * 3、子节点：无子节点，为叶子节点
 *
 * Exception in thread "main" java.lang.UnsupportedOperationException
 * 	at StructuralPattern.Composite.TransparentMode.Leaf.addChild(Leaf.java:18)
 * 	at StructuralPattern.Composite.TransparentMode.CompositeClient.main(CompositeClient.java:36)
 */
